/**
 * 
 */
package br.com.marsso.sorte.client.ui;

import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;

import br.com.marsso.sorte.shared.ModalidadeProxy;
import br.com.marsso.sorte.shared.SorteRequestFactory;
import br.com.marsso.sorte.shared.SorteRequestFactory.ModalidadeRequest;

import com.github.gwtbootstrap.client.ui.Button;
import com.github.gwtbootstrap.client.ui.Heading;
import com.github.gwtbootstrap.client.ui.TextBox;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.cellview.client.DataGrid;
import com.google.gwt.user.cellview.client.TextColumn;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.Widget;
import com.google.web.bindery.requestfactory.shared.Receiver;
import com.google.web.bindery.requestfactory.shared.Request;

/**
 * @author msouza
 * 
 */
public class ModalidadeForm extends Content {
	private static final Logger log = Logger.getLogger(ModalidadeForm.class
			.getName());

	SorteRequestFactory requestFactory;

	private static ModalidadeFormUiBinder uiBinder = GWT
			.create(ModalidadeFormUiBinder.class);

	List<ModalidadeProxy> lista = new ArrayList<ModalidadeProxy>();

	@UiField
	DataGrid<ModalidadeProxy> dataGrid = new DataGrid<ModalidadeProxy>();

	@UiField
	TextBox txbNmModalidade = new TextBox();

	@UiField
	Heading heading = new Heading(2);

	@UiField
	Button btnIncluirModalidade = new Button();

	ModalidadeProxy newModalidade;
	ModalidadeProxy editableModalidade;

	interface ModalidadeFormUiBinder extends UiBinder<Widget, ModalidadeForm> {
	}

	public ModalidadeForm(final SorteRequestFactory requestFactory) {
		this.requestFactory = requestFactory;

		initWidget(uiBinder.createAndBindUi(this));

		heading.add(new Label("Modalidades"));

		/*
		 * Do not refresh the headers every time the data is updated. The footer
		 * depends on the current data, so we do not disable auto refresh on the
		 * footer.
		 */
		dataGrid.setAutoHeaderRefreshDisabled(true);

		// dataGrid.setStyleName("bootstrap.min.css");

		// Set the message to display when the table is empty.
		dataGrid.setEmptyTableWidget(new Label("Nenhum registro disponivel"));

		// Add a text column to show the name.
		TextColumn<ModalidadeProxy> cdModalidadeColumn = new TextColumn<ModalidadeProxy>() {
			@Override
			public String getValue(ModalidadeProxy object) {
				return object.getCdModalidade().toString();
			}
		};
		dataGrid.addColumn(cdModalidadeColumn, "Codigo");

		// Add a text column to show the name.
		TextColumn<ModalidadeProxy> nmModalidadeColumn = new TextColumn<ModalidadeProxy>() {
			@Override
			public String getValue(ModalidadeProxy object) {
				return object.getNmModalidade();
			}
		};

		dataGrid.addColumn(nmModalidadeColumn, "Nome");

		updateGrid();

		btnIncluirModalidade.addClickHandler(new ClickHandler() {

			@Override
			public void onClick(ClickEvent event) {
				log.info("Iniciando inclusao de Modalidade");

				ModalidadeRequest createContext = requestFactory
						.getModalidadeRequest();

				log.info("Instanciando createRequest");
				Request<ModalidadeProxy> createRequest = createContext.create();

				log.info("firing the createRequest ");
				createRequest.fire(new Receiver<ModalidadeProxy>() {

					@Override
					public void onSuccess(ModalidadeProxy response) {
						log.info("Success occurred ");

						

							newModalidade = response;
							
							ModalidadeRequest countContext = requestFactory
									.getModalidadeRequest();

							Request<Integer> reqNewCodigo = countContext
									.count();

							reqNewCodigo.fire(new Receiver<Integer>() {
								@Override
								public void onSuccess(Integer response) {
									log.info("Total de modalidades: "
											+ response);
									ModalidadeRequest editContext = requestFactory
											.getModalidadeRequest();
									editableModalidade = editContext
											.edit(newModalidade);

									editableModalidade
											.setCdModalidade(response + 1);
									editableModalidade
											.setNmModalidade(txbNmModalidade
													.getText());

									editContext.persist(editableModalidade)
											.fire();
									
									log.info("Persistindo Modalidade: "
											+ editableModalidade
													.getCdModalidade()
											+ " - "
											+ editableModalidade
													.getNmModalidade());
									
									updateGrid();			

								}
							});
										
					}
				});
			}
		});		
	}

	private void updateGrid() {
		log.info("Updating datagrid ");

		ModalidadeRequest req = this.requestFactory.getModalidadeRequest();

		req.list().fire(new Receiver<List<ModalidadeProxy>>() {

			@Override
			public void onSuccess(List<ModalidadeProxy> response) {
				dataGrid.setRowData(response);
				dataGrid.flush();
				dataGrid.redraw();
			}
		});

	}

}
